package com.crayon2f.test.kindle;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class BatchAspectRatio3_4Resizer {

    // 支持的图片格式（可根据需要增减）
    private static final Set<String> SUPPORTED_FORMATS = new HashSet<>(Arrays.asList(
            "jpg", "jpeg", "png", "bmp", "gif"
    ));

    /**
     * 批量处理某个目录下的所有图片，将它们缩放为 3:4 比例（基于原图宽度）
     *
     * @param inputDirPath  输入目录，如 "input/"
     * @param outputDirPath 输出目录，如 "output/"
     */
    public static void batchResizeTo3_4AspectRatio(String inputDirPath, String outputDirPath) {
        File inputDir = new File(inputDirPath);
        File outputDir = new File(outputDirPath);

        // 检查输入目录是否存在
        if (!inputDir.exists() || !inputDir.isDirectory()) {
            System.err.println("❌ 输入目录不存在或不是一个目录: " + inputDirPath);
            return;
        }

        // 如果输出目录不存在，则创建它
        if (!outputDir.exists()) {
            if (!outputDir.mkdirs()) {
                System.err.println("❌ 无法创建输出目录: " + outputDirPath);
                return;
            }
        }

        // 获取输入目录中的所有文件
        File[] files = inputDir.listFiles();
        if (files == null || files.length == 0) {
            System.err.println("⚠️ 输入目录为空: " + inputDirPath);
            return;
        }

        int processedCount = 0;
        int skippedCount = 0;

        for (File inputFile : files) {
            if (inputFile.isDirectory()) {
                continue; // 跳过子目录
            }

            String fileName = inputFile.getName();
            String extension = getFileExtension(fileName).toLowerCase();

            // 只处理支持的图片格式
            if (!SUPPORTED_FORMATS.contains(extension)) {
                System.out.println("⚠️ 跳过不支持的文件（非图片或格式不支持）: " + fileName);
                skippedCount++;
                continue;
            }

            try {
                // 构建输出文件路径（保持原文件名）
                File outputFile = new File(outputDir, fileName);

                // 处理单张图片：按原图宽度缩放为 3:4
                resizeTo3_4UsingOriginalWidth(inputFile.getAbsolutePath(), outputFile.getAbsolutePath());

                processedCount++;
                System.out.println("✅ 已处理: " + fileName);

            } catch (Exception e) {
                System.err.println("❌ 处理文件失败: " + fileName + "，原因: " + e.getMessage());
                e.printStackTrace();
            }
        }

        System.out.println("\n📊 批量处理完成！");
        System.out.println("✅ 成功处理: " + processedCount + " 张图片");
        System.out.println("⚠️ 跳过: " + skippedCount + " 个文件（非图片或格式不支持）");
    }

    /**
     * 获取文件扩展名（如 "jpg"）
     */
    private static String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
            return ""; // 无扩展名
        }
        return fileName.substring(lastDotIndex + 1);
    }

    /**
     * 将单张图片按照原图宽度，缩放为 3:4 比例的图片
     *
     * @param inputImagePath  输入图片路径
     * @param outputImagePath 输出图片路径
     * @throws IOException 如果读写失败
     */
    public static void resizeTo3_4UsingOriginalWidth(String inputImagePath, String outputImagePath) throws IOException {
        BufferedImage originalImage = ImageIO.read(new File(inputImagePath));
        if (originalImage == null) {
            throw new IOException("无法读取图片，可能格式不支持: " + inputImagePath);
        }

        int targetWidth = originalImage.getWidth();
        int targetHeight = (int) Math.round(targetWidth * 4.0 / 3.0);

        BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);

        Graphics2D g = resizedImage.createGraphics();
        configureHighQualityRendering(g);
        g.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
        g.dispose();

        String formatName = outputImagePath.substring(outputImagePath.lastIndexOf('.') + 1).toLowerCase();
        ImageIO.write(resizedImage, formatName, new File(outputImagePath));

        System.out.printf("[内部] 已生成 3:4 图片：原宽度=%d, 新尺寸=%d x %d%n", targetWidth, targetWidth, targetHeight);
    }

    /**
     * 配置高质量渲染参数，确保缩放后清晰
     */
    private static void configureHighQualityRendering(Graphics2D g) {
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    }

    // =========================
    // 入口：main 方法，传入输入/输出目录
    // =========================
    public static void main(String[] args) {
        // 你可以直接在这里修改输入和输出目录
        String inputDirectory = "D:\\download\\edit-book\\input_images";
        String outputDirectory = "D:\\download\\edit-book\\output_images_640×480";

        System.out.println("🔧 开始批量处理图片，从目录: " + inputDirectory + " 到目录: " + outputDirectory);
        batchResizeTo3_4AspectRatio(inputDirectory, outputDirectory);
    }
}